#include "SQLASTOutputVisitorUtils.h"
#include "PrintableVisitor.h"
#include "../../sql/ast/expr/SQLNumberExpr.h"

#include "../../utils/StringUtils.h"
#include "../ast/expr/SQLCharExpr.h"
#include "../ast/expr/SQLIntegerExpr.h"

BOOL_ptr SQLASTOutputVisitorUtils::visit(PrintableVisitor *visitor, SQLIntegerExpr *x)
{
	visitor->print(make_string_ptr(std::to_string(x->getNumber())));
	return BOOL::FALSE;
}

BOOL_ptr SQLASTOutputVisitorUtils::visit(PrintableVisitor *visitor, SQLNumberExpr *x)
{
	visitor->print(make_string_ptr(std::to_string(x->getNumber())));
	return BOOL::FALSE;
}

BOOL_ptr SQLASTOutputVisitorUtils::visit(PrintableVisitor *visitor, SQLCharExpr *x)
{
	visitor->print('\'');

	string_ptr text = x->getText();
	text = StringUtils::replaceAll(text, make_string_ptr("'"), make_string_ptr("''"));
	text = StringUtils::replaceAll(text, make_string_ptr("\\\\"), make_string_ptr("\\\\"));

	visitor->print(text);

	visitor->print('\'');
	return BOOL::FALSE;
}
